package com.woniuxy.util;

import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 怎么理解线程安全问题：在没有同步干预的情况下，
 *                   程序的运行结果和预期的一样就是安全，反之就是不安全的。
 * 不安全代码： 对共享变量出现了非原子性操作。
 *          共享：线程共享
 *          非原子性操作: ++ -- 等计算
 *
 * 怎么解决：加锁
 * 悲观锁
 *    本地锁（JDK）：
 *          synchronized
 *          作用：可以让方法或者代码块变成同步。同步：同一时间类只允许一个线程进入
 *          ReentrantLock(重入锁)
 *          作用：只能让代码块变成同步
 *          使用：1：声明锁对象 2：加锁 3：释放锁
 *    分布式锁：
 *          利用redis实现
 * 乐观锁
 *
 * @author dingpf
 * @version 1.0
 * @description
 * @create 2025/4/24 14:50
 */
@Component
public class Count {

    public int count = 10000;

    ReentrantLock lock = new ReentrantLock(true);

    public void sub(){
        try {
            //lock.lock(); //加锁
            boolean b = lock.tryLock(); //线程尝试获取锁，获取到返回true。获取不到返回false
            if (b){
                if (count > 0){
                    count --; //1：读取原来的值
                    //2：对读取的值减一
                    //3：把计算后值重新赋值
                }
            } else {
                System.out.println("获取不到锁！");
            }

        } finally {
            //判断当前线程是否获取到锁，只能释放当前线程自己加的锁
            if (lock.isLocked() && lock.isHeldByCurrentThread()){
                lock.unlock(); //释放锁
            }

        }


    }
}
